import mean from "./mean.js";

/**
 * 计算N次方偏差之和
 * 当n=2时为平方偏差之和
 * 当n=3时为立方偏差之和
 *
 * @param {Array<number>} x 数据数组
 * @param {number} n 次方数
 * @returns {number} N次方偏差之和
 *
 * @example
 * var input = [1, 2, 3];
 * // 由于数据集的方差是均方偏差，可以通过sumNthPowerDeviations计算：
 * sumNthPowerDeviations(input, 2) / input.length;
 */
function sumNthPowerDeviations(x, n) {
    const meanValue = mean(x);
    let sum = 0;
    let tempValue;
    let i;

    // 优化处理：当计算平方(n=2)时，
    // 直接相乘比使用Math.pow方法更快
    if (n === 2) {
        for (i = 0; i < x.length; i++) {
            tempValue = x[i] - meanValue;
            sum += tempValue * tempValue;
        }
    } else {
        for (i = 0; i < x.length; i++) {
            sum += Math.pow(x[i] - meanValue, n);
        }
    }

    return sum;
}

export default sumNthPowerDeviations;
